/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package appbastanteo1.controller;

import appbastanteo1.model.Poder;
import appbastanteo1.model.Cliente;
import appbastanteo1.model.Representante;
import appbastanteo1.model.Bastanteo;
import appbastanteo1.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author JuanJose.Fuchs
 */
public class AdmBastanteos {

    private ArrayList<Bastanteo> bastanteos;
    private DateFormat formatter;

    public AdmBastanteos() {
        this.bastanteos = new ArrayList<Bastanteo>();
        formatter = new SimpleDateFormat("dd/MM/yyyy");
    }

    public int registrarBastanteo(
            Cliente cliente, Representante representante,
            String tipoIntervencion, ArrayList<Poder> poderes,
            Date fechaVencimiento, double importe) throws BusinessException {
//        if (bastanteoExiste(cliente, representante, poderes))
//            throw new BusinessException("Bastanteo duplicado");

        int idBastanteo = this.generarId();
        Bastanteo nuevoBastanteo = new Bastanteo(
                idBastanteo, cliente, representante, tipoIntervencion, poderes,
                fechaVencimiento, importe);
        this.bastanteos.add(nuevoBastanteo);
        return idBastanteo;
    }

    /**
     * @return the bastanteos
     */
    public ArrayList<Bastanteo> getBastanteos() {
        return bastanteos;
    }

    /**
     * @param bastanteos the bastanteos to set
     */
    public void setBastanteos(ArrayList<Bastanteo> bastanteos) {
        this.bastanteos = bastanteos;
    }

    private int generarId() {
        return this.bastanteos.size() + 1;
    }

    public Bastanteo obtenerBastanteo(int idBastanteo) {
        for (Bastanteo bastanteo : bastanteos) {
            if (bastanteo.getId() == idBastanteo) {
                return bastanteo;
            }
        }
        return null;
    }

    public boolean bastanteoXPoderExiste(Cliente cliente, Representante representante, ArrayList<Poder> poderes) {
        for (Bastanteo bastanteo : bastanteos) {

            if (bastanteo.getCliente().getCodigo().equals(cliente.getCodigo()) ||
                    bastanteo.getRepresentante().getNroDocumento().equals(representante.getNroDocumento())) {
                return false;
            } else {
                ArrayList<Poder> array = bastanteo.getPoderes();
                for (Poder poder : array) {
                    for (Poder poder1 : poderes) {
                        if (poder.getCodigoCorto().equals(poder1.getCodigoCorto())) {
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

    public ArrayList<Bastanteo> encontrarBastanteos(
            String rucCliente, String tipoDocRep, String nroDocRep) {
        ArrayList<Bastanteo> bastanteosEncontrados = new ArrayList<Bastanteo>();
        for (Bastanteo bastanteo : this.bastanteos) {
            Cliente cliente = bastanteo.getCliente();
            Representante representante = cliente.getRepresentante();
            if (cliente.getRuc().equals(rucCliente) &&
                    representante.getTipoDocumento().equalsIgnoreCase(tipoDocRep) &&
                    representante.getNroDocumento().equals(nroDocRep)) {
                bastanteosEncontrados.add(bastanteo);
            }
        }
        return bastanteosEncontrados;
    }

    public ArrayList<Bastanteo> encontrarBastanteos(
            String rucCliente, String tipoDocRep, String nroDocRep, String tipoIntervencion) {
        ArrayList<Bastanteo> bastanteosEncontrados1 =
                encontrarBastanteos(rucCliente, tipoDocRep, nroDocRep);
        ArrayList<Bastanteo> bastanteosEncontrados2 = new ArrayList<Bastanteo>();
        if (!tipoIntervencion.isEmpty()) {
            for (Bastanteo bastanteo : bastanteosEncontrados1) {
                if (bastanteo.getTipoIntervencion().equalsIgnoreCase(tipoIntervencion)) {
                    bastanteosEncontrados2.add(bastanteo);
                }
            }
        }
        else {
            bastanteosEncontrados2 = bastanteosEncontrados1;
        }
        return bastanteosEncontrados2;
    }

    public String verificarPoder(
            String rucCliente, String tipoDocRep, String nroDocRep,
            String codigoPoder, double importe) throws BusinessException {
        String mensaje = "No se encontró ningún bastanteo para los criterios ingresados";
        ArrayList<Bastanteo> bastanteosEncontrados = this.encontrarBastanteos(
                rucCliente, tipoDocRep, nroDocRep);
        Poder poder = null;
        for (Bastanteo bastanteo : bastanteosEncontrados) {
            AdmPoderes admPoderes = new AdmPoderes();
            admPoderes.setPoderes(bastanteo.getPoderes());
            poder = admPoderes.buscarPoderes(codigoPoder);
            if (poder != null) {
                if (bastanteo.getFechaVencimiento().before(Calendar.getInstance().getTime())) {
                    throw new BusinessException("El poder de tipo \"" +
                            bastanteo.getTipoIntervencion() + "\" " +
                            "para este representante venció el: " +
                            formatter.format(bastanteo.getFechaVencimiento()));
                } else if (bastanteo.getImporte() < importe) {
                    throw new BusinessException(
                            "El representante sólo tiene poder para realizar " +
                            "este tipo de operaciones hasta por un monto de: " +
                            Double.toString(bastanteo.getImporte()));
                } else {
                    mensaje = "El representante tiene poder de tipo: " +
                            bastanteo.getTipoIntervencion();
                    break;
                }
            }
        }
        if (poder == null) {
            throw new BusinessException(
                    "El representante no tiene poder para realizar esta operación");
        }
        return mensaje;
    }

    public int cantidadBastanteos() {
        return bastanteos.size();
    }

    public boolean validarCampos(
            String cliente,
            String representante,
            int tipointervencion,
            int grupopoderes,
            String monto,
            String fecha){
        
        try {
              if (cliente.equals("")||cliente==null) {
            return false;
        }
        if (representante.equals("")||representante==null) {
            return false;
        }
         if (monto.equals("")||monto==null) {
            return false;
        }
         if (fecha.equals("")||fecha==null) {
            return false;
        }
        if (tipointervencion==-1||tipointervencion==0) {
            return false;
        }
         if (grupopoderes==-1||grupopoderes==0) {
            return false;
        }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

}
